home *** CD-ROM | disk | FTP | other *** search
- /* specfunc/airy_der.c
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- /* Author: G. Jungman */
-
- #include <config.h>
- #include <gsl/gsl_math.h>
- #include <gsl/gsl_errno.h>
- #include <gsl/gsl_sf_exp.h>
- #include <gsl/gsl_sf_airy.h>
-
- #include "error.h"
-
- #include "chebyshev.h"
- #include "cheb_eval_mode.c"
-
- /*-*-*-*-*-*-*-*-*-*-*-* Private Section *-*-*-*-*-*-*-*-*-*-*-*/
-
-
- /* based on SLATEC aide.f, bide.f, aid.f, bid.f, r9admp.f */
-
- /*
- series for aif on the interval -1.00000e+00 to 1.00000e+00
- with weighted error 5.22e-18
- log weighted error 17.28
- significant figures required 16.01
- decimal places required 17.73
- */
- static double aif_data[8] = {
- 0.10527461226531408809,
- 0.01183613628152997844,
- 0.00012328104173225664,
- 0.00000062261225638140,
- 0.00000000185298887844,
- 0.00000000000363328873,
- 0.00000000000000504622,
- 0.00000000000000000522
- };
- static cheb_series aif_cs = {
- aif_data,
- 7,
- -1, 1,
- 7
- };
-
- /*
- series for aig on the interval -1.00000e+00 to 1.00000e+00
- with weighted error 3.14e-19
- log weighted error 18.50
- significant figures required 17.44
- decimal places required 18.98
- */
- static double aig_data[9] = {
- 0.021233878150918666852,
- 0.086315930335214406752,
- 0.001797594720383231358,
- 0.000014265499875550693,
- 0.000000059437995283683,
- 0.000000000152403366479,
- 0.000000000000264587660,
- 0.000000000000000331562,
- 0.000000000000000000314
- };
- static cheb_series aig_cs = {
- aig_data,
- 8,
- -1, 1,
- 8
- };
-
- /*
- series for aip2 on the interval 0.00000e+00 to 1.25000e-01
- with weighted error 2.15e-17
- log weighted error 16.67
- significant figures required 14.27
- decimal places required 17.26
- */
- static double aip2_data[15] = {
- 0.0065457691989713757,
- 0.0023833724120774592,
- -0.0000430700770220586,
- 0.0000015629125858629,
- -0.0000000815417186163,
- 0.0000000054103738057,
- -0.0000000004284130883,
- 0.0000000000389497963,
- -0.0000000000039623161,
- 0.0000000000004428184,
- -0.0000000000000536297,
- 0.0000000000000069650,
- -0.0000000000000009620,
- 0.0000000000000001403,
- -0.0000000000000000215
- };
- static cheb_series aip2_cs = {
- aip2_data,
- 14,
- -1, 1,
- 9
- };
-
- /*
- series for aip1 on the interval 1.25000e-01 to 1.00000e+00
- with weighted error 2.60e-17
- log weighted error 16.58
- significant figures required 14.91
- decimal places required 17.28
- */
- static double aip1_data[25] = {
- 0.0358865097808301538,
- 0.0114668575627764899,
- -0.0007592073583861400,
- 0.0000869517610893841,
- -0.0000128237294298592,
- 0.0000022062695681038,
- -0.0000004222295185921,
- 0.0000000874686415726,
- -0.0000000192773588418,
- 0.0000000044668460054,
- -0.0000000010790108052,
- 0.0000000002700029447,
- -0.0000000000696480108,
- 0.0000000000184489907,
- -0.0000000000050027817,
- 0.0000000000013852243,
- -0.0000000000003908218,
- 0.0000000000001121536,
- -0.0000000000000326862,
- 0.0000000000000096619,
- -0.0000000000000028935,
- 0.0000000000000008770,
- -0.0000000000000002688,
- 0.0000000000000000832,
- -0.0000000000000000260
- };
- static cheb_series aip1_cs = {
- aip1_data,
- 24,
- -1, 1,
- 14
- };
-
-
- /*
- series for bif on the interval -1.00000e+00 to 1.00000e+00
- with weighted error 9.05e-18
- log weighted error 17.04
- significant figures required 15.83
- decimal places required 17.49
- */
- static double bif_data[8] = {
- 0.1153536790828570243,
- 0.0205007894049192875,
- 0.0002135290278902876,
- 0.0000010783960614677,
- 0.0000000032094708833,
- 0.0000000000062930407,
- 0.0000000000000087403,
- 0.0000000000000000090
- };
- static cheb_series bif_cs = {
- bif_data,
- 7,
- -1, 1,
- 7
- };
-
- /*
- series for big on the interval -1.00000e+00 to 1.00000e+00
- with weighted error 5.44e-19
- log weighted error 18.26
- significant figures required 17.46
- decimal places required 18.74
- */
- static double big_data[9] = {
- -0.097196440416443537390,
- 0.149503576843167066571,
- 0.003113525387121326042,
- 0.000024708570579821297,
- 0.000000102949627731379,
- 0.000000000263970373987,
- 0.000000000000458279271,
- 0.000000000000000574283,
- 0.000000000000000000544
- };
- static cheb_series big_cs = {
- big_data,
- 8,
- -1, 1,
- 8
- };
-
- /*
- series for bif2 on the interval 1.00000e+00 to 8.00000e+00
- with weighted error 3.82e-19
- log weighted error 18.42
- significant figures required 17.68
- decimal places required 18.92
- */
- static double bif2_data[10] = {
- 0.323493987603522033521,
- 0.086297871535563559139,
- 0.002994025552655397426,
- 0.000051430528364661637,
- 0.000000525840250036811,
- 0.000000003561751373958,
- 0.000000000017146864007,
- 0.000000000000061663520,
- 0.000000000000000171911,
- 0.000000000000000000382
- };
- static cheb_series bif2_cs = {
- bif2_data,
- 9,
- -1, 1,
- 9
- };
-
- /*
- series for big2 on the interval 1.00000e+00 to 8.00000e+00
- with weighted error 3.35e-17
- log weighted error 16.48
- significant figures required 16.52
- decimal places required 16.98
- */
- static double big2_data[10] = {
- 1.6062999463621294578,
- 0.7449088819876088652,
- 0.0470138738610277380,
- 0.0012284422062548239,
- 0.0000173222412256624,
- 0.0000001521901652368,
- 0.0000000009113560249,
- 0.0000000000039547918,
- 0.0000000000000130017,
- 0.0000000000000000335
- };
- static cheb_series big2_cs = {
- big2_data,
- 9,
- -1, 1,
- 9
- };
-
- /*
- series for bip2 on the interval 0.00000e+00 to 1.25000e-01
- with weighted error 2.07e-18
- log weighted error 17.69
- significant figures required 16.51
- decimal places required 18.42
- */
- static double bip2_data[29] = {
- -0.13269705443526630495,
- -0.00568443626045977481,
- -0.00015643601119611610,
- -0.00001136737203679562,
- -0.00000143464350991284,
- -0.00000018098531185164,
- 0.00000000926177343611,
- 0.00000001710005490721,
- 0.00000000476698163504,
- -0.00000000035195022023,
- -0.00000000058890614316,
- -0.00000000006678499608,
- 0.00000000006395565102,
- 0.00000000001554529427,
- -0.00000000000792397000,
- -0.00000000000258326243,
- 0.00000000000121655048,
- 0.00000000000038707207,
- -0.00000000000022487045,
- -0.00000000000004953477,
- 0.00000000000004563782,
- 0.00000000000000332998,
- -0.00000000000000921750,
- 0.00000000000000094157,
- 0.00000000000000167154,
- -0.00000000000000055134,
- -0.00000000000000022369,
- 0.00000000000000017487,
- 0.00000000000000000207
- };
- static cheb_series bip2_cs = {
- bip2_data,
- 28,
- -1, 1,
- 14
- };
-
- /*
- series for bip1 on the interval 1.25000e-01 to 3.53553e-01
- with weighted error 1.86e-17
- log weighted error 16.73
- significant figures required 15.67
- decimal places required 17.42
- */
- static double bip1_data[24] = {
- -0.1729187351079553719,
- -0.0149358492984694364,
- -0.0005471104951678566,
- 0.0001537966292958408,
- 0.0000154353476192179,
- -0.0000065434113851906,
- 0.0000003728082407879,
- 0.0000002072078388189,
- -0.0000000658173336470,
- 0.0000000074926746354,
- 0.0000000011101336884,
- -0.0000000007265140553,
- 0.0000000001782723560,
- -0.0000000000217346352,
- -0.0000000000020302035,
- 0.0000000000019311827,
- -0.0000000000006044953,
- 0.0000000000001209450,
- -0.0000000000000125109,
- -0.0000000000000019917,
- 0.0000000000000015154,
- -0.0000000000000004977,
- 0.0000000000000001155,
- -0.0000000000000000186
- };
- static cheb_series bip1_cs = {
- bip1_data,
- 23,
- -1, 1,
- 13
- };
-
- /*
- series for an22 on the interval -1.00000e+00 to -1.25000e-01
- with weighted error 3.30e-17
- log weighted error 16.48
- significant figures required 14.95
- decimal places required 17.24
- */
- static double an22_data[33] = {
- 0.0537418629629794329,
- -0.0126661435859883193,
- -0.0011924334106593007,
- -0.0002032327627275655,
- -0.0000446468963075164,
- -0.0000113359036053123,
- -0.0000031641352378546,
- -0.0000009446708886149,
- -0.0000002966562236472,
- -0.0000000969118892024,
- -0.0000000326822538653,
- -0.0000000113144618964,
- -0.0000000040042691002,
- -0.0000000014440333684,
- -0.0000000005292853746,
- -0.0000000001967763374,
- -0.0000000000740800096,
- -0.0000000000282016314,
- -0.0000000000108440066,
- -0.0000000000042074801,
- -0.0000000000016459150,
- -0.0000000000006486827,
- -0.0000000000002574095,
- -0.0000000000001027889,
- -0.0000000000000412846,
- -0.0000000000000166711,
- -0.0000000000000067657,
- -0.0000000000000027585,
- -0.0000000000000011296,
- -0.0000000000000004645,
- -0.0000000000000001917,
- -0.0000000000000000794,
- -0.0000000000000000330
- };
- static cheb_series an22_cs = {
- an22_data,
- 32,
- -1, 1,
- 18
- };
-
- /*
- series for an21 on the interval -1.25000e-01 to -1.56250e-02
- with weighted error 3.43e-17
- log weighted error 16.47
- significant figures required 14.48
- decimal places required 17.16
- */
- static double an21_data[24] = {
- 0.0198313155263169394,
- -0.0029376249067087533,
- -0.0001136260695958196,
- -0.0000100554451087156,
- -0.0000013048787116563,
- -0.0000002123881993151,
- -0.0000000402270833384,
- -0.0000000084996745953,
- -0.0000000019514839426,
- -0.0000000004783865344,
- -0.0000000001236733992,
- -0.0000000000334137486,
- -0.0000000000093702824,
- -0.0000000000027130128,
- -0.0000000000008075954,
- -0.0000000000002463214,
- -0.0000000000000767656,
- -0.0000000000000243883,
- -0.0000000000000078831,
- -0.0000000000000025882,
- -0.0000000000000008619,
- -0.0000000000000002908,
- -0.0000000000000000993,
- -0.0000000000000000343
- };
- static cheb_series an21_cs = {
- an21_data,
- 23,
- -1, 1,
- 12
- };
-
- /*
- series for an20 on the interval -1.56250e-02 to 0.00000e+00
- with weighted error 4.41e-17
- log weighted error 16.36
- significant figures required 14.16
- decimal places required 16.96
- */
- static double an20_data[16] = {
- 0.0126732217145738027,
- -0.0005212847072615621,
- -0.0000052672111140370,
- -0.0000001628202185026,
- -0.0000000090991442687,
- -0.0000000007438647126,
- -0.0000000000795494752,
- -0.0000000000104050944,
- -0.0000000000015932426,
- -0.0000000000002770648,
- -0.0000000000000535343,
- -0.0000000000000113062,
- -0.0000000000000025772,
- -0.0000000000000006278,
- -0.0000000000000001621,
- -0.0000000000000000441
- };
- static cheb_series an20_cs = {
- an20_data,
- 15,
- -1, 1,
- 8
- };
-
- /*
- series for aph2 on the interval -1.00000e+00 to -1.25000e-01
- with weighted error 2.94e-17
- log weighted error 16.53
- significant figures required 15.58
- decimal places required 17.28
- */
- static double aph2_data[32] = {
- -0.2057088719781465107,
- 0.0422196961357771922,
- 0.0020482560511207275,
- 0.0002607800735165006,
- 0.0000474824268004729,
- 0.0000105102756431612,
- 0.0000026353534014668,
- 0.0000007208824863499,
- 0.0000002103236664473,
- 0.0000000644975634555,
- 0.0000000205802377264,
- 0.0000000067836273921,
- 0.0000000022974015284,
- 0.0000000007961306765,
- 0.0000000002813860610,
- 0.0000000001011749057,
- 0.0000000000369306738,
- 0.0000000000136615066,
- 0.0000000000051142751,
- 0.0000000000019351689,
- 0.0000000000007393607,
- 0.0000000000002849792,
- 0.0000000000001107281,
- 0.0000000000000433412,
- 0.0000000000000170801,
- 0.0000000000000067733,
- 0.0000000000000027017,
- 0.0000000000000010835,
- 0.0000000000000004367,
- 0.0000000000000001769,
- 0.0000000000000000719,
- 0.0000000000000000294
- };
- static cheb_series aph2_cs = {
- aph2_data,
- 31,
- -1, 1,
- 16
- };
-
- /*
- series for aph1 on the interval -1.25000e-01 to -1.56250e-02
- with weighted error 6.38e-17
- log weighted error 16.20
- significant figures required 14.91
- decimal places required 16.87
- */
- static double aph1_data[22] = {
- -0.1024172908077571694,
- 0.0071697275146591248,
- 0.0001209959363122329,
- 0.0000073361512841220,
- 0.0000007535382954272,
- 0.0000001041478171741,
- 0.0000000174358728519,
- 0.0000000033399795033,
- 0.0000000007073075174,
- 0.0000000001619187515,
- 0.0000000000394539982,
- 0.0000000000101192282,
- 0.0000000000027092778,
- 0.0000000000007523806,
- 0.0000000000002156369,
- 0.0000000000000635283,
- 0.0000000000000191757,
- 0.0000000000000059143,
- 0.0000000000000018597,
- 0.0000000000000005950,
- 0.0000000000000001934,
- 0.0000000000000000638
- };
- static cheb_series aph1_cs = {
- aph1_data,
- 21,
- -1, 1,
- 10
- };
-
- /*
- series for aph0 on the interval -1.56250e-02 to 0.00000e+00
- with weighted error 2.29e-17
- log weighted error 16.64
- significant figures required 15.27
- decimal places required 17.23
- */
- static double aph0_data[15] = {
- -0.0855849241130933257,
- 0.0011214378867065261,
- 0.0000042721029353664,
- 0.0000000817607381483,
- 0.0000000033907645000,
- 0.0000000002253264423,
- 0.0000000000206284209,
- 0.0000000000023858763,
- 0.0000000000003301618,
- 0.0000000000000527010,
- 0.0000000000000094555,
- 0.0000000000000018709,
- 0.0000000000000004024,
- 0.0000000000000000930,
- 0.0000000000000000229
- };
- static cheb_series aph0_cs = {
- aph0_data,
- 14,
- -1, 1,
- 7
- };
-
-
- static
- int
- airy_deriv_mod_phase(const double x, gsl_mode_t mode,
- gsl_sf_result * ampl, gsl_sf_result * phi)
- {
- const double pi34 = 2.356194490192344928847;
- gsl_sf_result result_a;
- gsl_sf_result result_p;
- double a, p;
- double sqx;
- double x32;
-
- if(x <= -4.0) {
- double z = 128.0/(x*x*x) + 1.0;
- cheb_eval_mode_e(&an20_cs, z, mode, &result_a);
- cheb_eval_mode_e(&aph0_cs, z, mode, &result_p);
- }
- else if(x <= -2.0) {
- double z = (128.0/(x*x*x) + 9.0) / 7.0;
- cheb_eval_mode_e(&an21_cs, z, mode, &result_a);
- cheb_eval_mode_e(&aph1_cs, z, mode, &result_p);
- }
- else if(x <= -1.0) {
- double z = (16.0/(x*x*x) + 9.0) / 7.0;
- cheb_eval_mode_e(&an22_cs, z, mode, &result_a);
- cheb_eval_mode_e(&aph2_cs, z, mode, &result_p);
- }
- else {
- ampl->val = 0.0;
- ampl->err = 0.0;
- phi->val = 0.0;
- phi->err = 0.0;
- GSL_ERROR ("x is greater than 1.0", GSL_EDOM);
- }
-
- a = 0.3125 + result_a.val;
- p = -0.625 + result_p.val;
-
- sqx = sqrt(-x);
- x32 = x*sqx;
-
- ampl->val = sqrt(a * sqx);
- ampl->err = fabs(ampl->val) * (GSL_DBL_EPSILON + fabs(result_a.err/result_a.val));
- phi->val = pi34 - x * sqx * p;
- phi->err = fabs(phi->val) * (GSL_DBL_EPSILON + fabs(result_p.err/result_p.val));
-
- return GSL_SUCCESS;
- }
-
-
- /*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
-
- int
- gsl_sf_airy_Ai_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
- {
- /* CHECK_POINTER(result) */
-
- if(x < -1.0) {
- gsl_sf_result a;
- gsl_sf_result p;
- int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
- double c = cos(p.val);
- result->val = a.val * c;
- result->err = fabs(result->val * p.err) + fabs(c * a.err);
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return status_ap;
- }
- else if(x <= 1.0) {
- const double x3 = x*x*x;
- const double x2 = x*x;
- gsl_sf_result result_c0;
- gsl_sf_result result_c1;
- cheb_eval_mode_e(&aif_cs, x3, mode, &result_c0);
- cheb_eval_mode_e(&aig_cs, x3, mode, &result_c1);
-
- result->val = (x2*(0.125 + result_c0.val) - result_c1.val) - 0.25;
- result->err = fabs(x2*result_c0.val) + result_c1.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
-
- if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
- /* scale only if x is positive */
- double s = exp(2.0*x*sqrt(x)/3.0);
- result->val *= s;
- result->err *= s;
- }
-
- return GSL_SUCCESS;
- }
- else if(x <= 4.0) {
- const double sqrtx = sqrt(x);
- const double z = (16.0/(x*sqrtx) - 9.0)/7.0;
- const double s = sqrt(sqrtx);
- gsl_sf_result result_c0;
- cheb_eval_mode_e(&aip1_cs, z, mode, &result_c0);
- result->val = -(0.28125 + result_c0.val) * s;
- result->err = result_c0.err * s;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else {
- const double sqrtx = sqrt(x);
- const double z = 16.0/(x*sqrtx) - 1.0;
- const double s = sqrt(sqrtx);
- gsl_sf_result result_c0;
- cheb_eval_mode_e(&aip2_cs, z, mode, &result_c0);
- result->val = -(0.28125 + result_c0.val) * s;
- result->err = result_c0.err * s;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- }
-
-
- int
- gsl_sf_airy_Ai_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
- {
- /* CHECK_POINTER(result) */
-
- if(x < -1.0) {
- gsl_sf_result a;
- gsl_sf_result p;
- int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
- double c = cos(p.val);
- result->val = a.val * c;
- result->err = fabs(result->val * p.err) + fabs(c * a.err);
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return status_ap;
- }
- else if(x < 1.0) {
- const double x3 = x*x*x;
- gsl_sf_result result_c1;
- gsl_sf_result result_c2;
- cheb_eval_mode_e(&aif_cs, x3, mode, &result_c1);
- cheb_eval_mode_e(&aig_cs, x3, mode, &result_c2);
- result->val = (x*x*(0.125 + result_c1.val) - result_c2.val) - 0.25;
- result->err = fabs(x*x*result_c1.err) + result_c2.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else if(x*x*x < 9.0/4.0 * GSL_LOG_DBL_MIN*GSL_LOG_DBL_MIN) {
- gsl_sf_result result_aps;
- const double arg = -2.0*x*sqrt(x)/3.0;
- const int stat_a = gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result_aps);
- const int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
- result_aps.val, result_aps.err,
- result);
- return GSL_ERROR_SELECT_2(stat_e, stat_a);
- }
- else {
- UNDERFLOW_ERROR(result);
- }
- }
-
-
- int
- gsl_sf_airy_Bi_deriv_scaled_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
- {
- const double atr = 8.7506905708484345; /* 16./(sqrt(8)-1) */
- const double btr = -2.0938363213560543; /* -(sqrt(8)+1)/(sqrt(8)-1) */
-
- /* CHECK_POINTER(result) */
-
- if(x < -1.0) {
- gsl_sf_result a;
- gsl_sf_result p;
- int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
- double s = sin(p.val);
- result->val = a.val * s;
- result->err = fabs(result->val * p.err) + fabs(s * a.err);
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return status_ap;
- }
- else if(x < 1.0) {
- const double x3 = x*x*x;
- const double x2 = x*x;
- gsl_sf_result result_c1;
- gsl_sf_result result_c2;
- cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
- cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
- result->val = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
- result->err = x2 * result_c1.err + result_c2.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
-
- if(x > GSL_ROOT3_DBL_EPSILON*GSL_ROOT3_DBL_EPSILON) {
- /* scale only if x is positive */
- const double s = exp(-2.0*x*sqrt(x)/3.0);
- result->val *= s;
- result->err *= s;
- }
-
- return GSL_SUCCESS;
- }
- else if(x < 2.0) {
- const double z = (2.0*x*x*x - 9.0) / 7.0;
- const double s = exp(-2.0*x*sqrt(x)/3.0);
- gsl_sf_result result_c0;
- gsl_sf_result result_c1;
- cheb_eval_mode_e(&bif2_cs, z, mode, &result_c0);
- cheb_eval_mode_e(&big2_cs, z, mode, &result_c1);
- result->val = s * (x*x * (0.25 + result_c0.val) + 0.5 + result_c1.val);
- result->err = s * (x*x * result_c0.err + result_c1.err);
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else if(x < 4.0) {
- const double sqrtx = sqrt(x);
- const double z = atr/(x*sqrtx) + btr;
- const double s = sqrt(sqrtx);
- gsl_sf_result result_c0;
- cheb_eval_mode_e(&bip1_cs, z, mode, &result_c0);
- result->val = s * (0.625 + result_c0.val);
- result->err = s * result_c0.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else {
- const double sqrtx = sqrt(x);
- const double z = 16.0/(x*sqrtx) - 1.0;
- const double s = sqrt(sqrtx);
- gsl_sf_result result_c0;
- cheb_eval_mode_e(&bip2_cs, z, mode, &result_c0);
- result->val = s * (0.625 + result_c0.val);
- result->err = s * result_c0.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- }
-
-
- int
- gsl_sf_airy_Bi_deriv_e(const double x, gsl_mode_t mode, gsl_sf_result * result)
- {
- /* CHECK_POINTER(result) */
-
- if(x < -1.0) {
- gsl_sf_result a;
- gsl_sf_result p;
- int status_ap = airy_deriv_mod_phase(x, mode, &a, &p);
- double s = sin(p.val);
- result->val = a.val * s;
- result->err = fabs(result->val * p.err) + fabs(s * a.err);
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return status_ap;
- }
- else if(x < 1.0) {
- const double x3 = x*x*x;
- const double x2 = x*x;
- gsl_sf_result result_c1;
- gsl_sf_result result_c2;
- cheb_eval_mode_e(&bif_cs, x3, mode, &result_c1);
- cheb_eval_mode_e(&big_cs, x3, mode, &result_c2);
- result->val = x2 * (result_c1.val + 0.25) + result_c2.val + 0.5;
- result->err = x2 * result_c1.err + result_c2.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else if(x < 2.0) {
- const double z = (2.0*x*x*x - 9.0) / 7.0;
- gsl_sf_result result_c1;
- gsl_sf_result result_c2;
- cheb_eval_mode_e(&bif2_cs, z, mode, &result_c1);
- cheb_eval_mode_e(&big2_cs, z, mode, &result_c2);
- result->val = x*x * (result_c1.val + 0.25) + result_c2.val + 0.5;
- result->err = x*x * result_c1.err + result_c2.err;
- result->err += GSL_DBL_EPSILON * fabs(result->val);
- return GSL_SUCCESS;
- }
- else if(x < GSL_ROOT3_DBL_MAX*GSL_ROOT3_DBL_MAX) {
- gsl_sf_result result_bps;
- const double arg = 2.0*(x*sqrt(x)/3.0);
- int stat_b = gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result_bps);
- int stat_e = gsl_sf_exp_mult_err_e(arg, 1.5*fabs(arg*GSL_DBL_EPSILON),
- result_bps.val, result_bps.err,
- result);
- return GSL_ERROR_SELECT_2(stat_e, stat_b);
- }
- else {
- OVERFLOW_ERROR(result);
- }
- }
-
- /*-*-*-*-*-*-*-*-*-* Functions w/ Natural Prototypes *-*-*-*-*-*-*-*-*-*-*/
-
- #include "eval.h"
-
- double gsl_sf_airy_Ai_deriv_scaled(const double x, gsl_mode_t mode)
- {
- EVAL_RESULT(gsl_sf_airy_Ai_deriv_scaled_e(x, mode, &result));
- }
-
- double gsl_sf_airy_Ai_deriv(const double x, gsl_mode_t mode)
- {
- EVAL_RESULT(gsl_sf_airy_Ai_deriv_e(x, mode, &result));
- }
-
- double gsl_sf_airy_Bi_deriv_scaled(const double x, gsl_mode_t mode)
- {
- EVAL_RESULT(gsl_sf_airy_Bi_deriv_scaled_e(x, mode, &result));
- }
-
- double gsl_sf_airy_Bi_deriv(const double x, gsl_mode_t mode)
- {
- EVAL_RESULT(gsl_sf_airy_Bi_deriv_e(x, mode, &result));
- }
-